module Spec
  module Expectations
    # rspec adds #should and #should_not to every Object (and,
    # implicitly, every Class).
    module ObjectExpectations

      # :call-seq:
      #   should(matcher)
      #   should == expected
      #   should =~ expected
      #
      #   receiver.should(matcher)
      #     => Passes if matcher.matches?(receiver)
      #
      #   receiver.should == expected #any value
      #     => Passes if (receiver == expected)
      #
      #   receiver.should =~ regexp
      #     => Passes if (receiver =~ regexp)
      #
      # See Spec::Matchers for more information about matchers
      #
      # == Warning
      #
      # NOTE that this does NOT support receiver.should != expected.
      # Instead, use receiver.should_not == expected
      def should(matcher=nil, &block)
        return ExpectationMatcherHandler.handle_matcher(self, matcher, &block) if matcher
        Should::Should.new(self)
      end

      # :call-seq:
      #   should_not(matcher)
      #   should_not == expected
      #   should_not =~ expected
      #
      #   receiver.should_not(matcher)
      #     => Passes unless matcher.matches?(receiver)
      #
      #   receiver.should_not == expected
      #     => Passes unless (receiver == expected)
      #
      #   receiver.should_not =~ regexp
      #     => Passes unless (receiver =~ regexp)
      #
      # See Spec::Matchers for more information about matchers
      def should_not(matcher=nil, &block)
        return NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block) if matcher
        should.not
      end

      deprecated do
        # Deprecated: use should have(n).items (see Spec::Matchers)
        # This will be removed in 0.9
        def should_have(expected)
          should.have(expected)
        end
        alias_method :should_have_exactly, :should_have

        # Deprecated: use should have_at_least(n).items (see Spec::Matchers)
        # This will be removed in 0.9
        def should_have_at_least(expected)
          should.have.at_least(expected)
        end
      
        # Deprecated: use should have_at_most(n).items (see Spec::Matchers)
        # This will be removed in 0.9
        def should_have_at_most(expected)
          should.have.at_most(expected)
        end

        # Deprecated: use should include(expected) (see Spec::Matchers)
        # This will be removed in 0.9
        def should_include(expected)
          should.include(expected)
        end

        # Deprecated: use should_not include(expected) (see Spec::Matchers)
        # This will be removed in 0.9
        def should_not_include(expected)
          should.not.include(expected)
        end

        # Deprecated: use should be(expected) (see Spec::Matchers)
        # This will be removed in 0.9
        def should_be(expected = :___no_arg)
          should.be(expected)
        end
      
        # Deprecated: use should_not be(expected) (see Spec::Matchers)
        # This will be removed in 0.9
        def should_not_be(expected = :___no_arg)
          should_not.be(expected)
        end
      end
    end
  end
end

class Object
  include Spec::Expectations::ObjectExpectations
  deprecated do
    include Spec::Expectations::UnderscoreSugar
  end
end

deprecated do
  Object.handle_underscores_for_rspec!
end

syntax highlighted by Code2HTML, v. 0.9.1