Made the methods public so that child classes in other packages can override.
Added a factory method that accepts an input stream.
Fixed a defect in the canProcess method which was checking for null rather than the optional isPresent.