Given the fact that the behavior of `be_between` vs `be_between(...).exclusive` is identical except for the failure message and the behavior at the min and max values, I think this is a good use case for shared example groups:

``` ruby
shared_examples_for "be_between" do |between_type|
  it 'passes if target is < max and > min' do
    expect(5).to matcher(1, 10)
  end

  it 'fails if target is > max' do
    expect {
      expect(11).to matcher(1, 10)
    }.to fail_with("expected 11 to be between 1 and 10 (#{between_type})")
  end

   # etc
end

describe "be_between (inclusive)" do
  it_behaves_like "be between", :inclusive do
    def matcher(min, max)
      be_between(min, max)
    end
  end

  # specs unique to inclusive would go here
end

describe "be_between (exclusive)" do
  it_behaves_like "be between", :exclusive do
    def matcher(min, max)
      be_between(min, max).exlusive
    end
  end

  # specs unique to exclusive would go here
end
```