Customers can buy anything and select the 'collect in store option'.
For a subset of the products there is the option to have the item sent out in the post.
There needs to be a requirement to tell the customers that a product is 'collect in store' only. The easiest way to do this is to have another product attribute that is 'collect in store'. In that way the catalog is obvious and easy to maintain by someone other than you.
Collect in store is also the same conceptually as 'free shipping'. If you want to avoid making yet another module you could just have the free shipping method's label re-arranged as per this article here:
Now you can add a shopping cart sales rule to make 'free shipping' condition as per the rules you set. Everything then just works with no coding involved. That does compromise your 'free shipping' options in the future though.
To go modular you can use some other module as a starting point. This one is pretty good for that:
You can change the logic for whether the method gets shown or not. This could work on a newly added attribute or do some other function on the cart products.