# -*- coding: utf-8 -*-

module DataMapper
  module Validation
    module Fixtures
      # If you think that this particular fixture class
      # and assumptions made below are full of bullshit
      # and author is a moron, you are 100% right. I am,
      # but it's me who rewrites poor dm-validations
      # spec suite this time, so unless someone smart
      # steps up to do it, we have to roll on with
      # this crappy example of method validation. — MK
      class ProgrammingLanguage
        #
        # Behaviors
        #

        include ::DataMapper::Validations

        #
        # Attributes
        #

        attr_accessor :name, :allows_system_calls, :allows_manual_memory_management, :allows_optional_parentheses,
          :allows_operator_overload, :approved_by_linus, :compiler_excels_at_utilizing_cpu_cache,
          :is_very_high_level, :does_not_require_explicit_return_keyword, :standard_library_support_parallel_programming_out_of_the_box

        #
        # Validations
        #

        validates_with_method :ensure_appropriate_for_system_programming,  :when => [:doing_system_programming, :hacking_on_the_kernel, :implementing_a_game_engine]
        validates_with_method :ensure_appropriate_for_dsls,                :when => [:implementing_a_dsl]
        validates_with_method :ensure_appropriate_for_cpu_intensive_tasks, :when => [:implementing_a_game_engine_core]
        validates_with_method :ensure_approved_by_linus_himself,           :when => [:hacking_on_the_kernel], :violation_type => :unapproved_by_linus

        #
        # API
        #

        def initialize(args = {})
          args.each do |key, value|
            self.send("#{key}=", value)
          end
        end

        def ensure_appropriate_for_system_programming
          if allows_manual_memory_management && allows_system_calls
            true
          else
            [false, "try something that is closer to the metal"]
          end
        end

        def ensure_appropriate_for_dsls
           if allows_optional_parentheses && allows_operator_overload && is_very_high_level && does_not_require_explicit_return_keyword
            true
          else
            [false, "may not be so good for domain specific languages"]
          end
        end

        def ensure_appropriate_for_cpu_intensive_tasks
          if compiler_excels_at_utilizing_cpu_cache && allows_manual_memory_management
            true
          else
            [false, "may not be so good for CPU intensive tasks"]
          end
        end

        def ensure_approved_by_linus_himself
          if name.downcase == "c++"
            [false, "Quite frankly, even if the choice of C were to do *nothing*
              but keep the C++ programmers out, that in itself would be
              a huge reason to use C."]
          else
            true
          end
        end
      end # ProgrammingLanguage
    end # Fixtures
  end # Validations
end # DataMapper
