    public Object parse(ParsingEngine parsingEngine, ArgumentSource source, Type type, ArgumentMatches matches) {
        ArgumentDefinition defaultDefinition = createDefaultArgumentDefinition(source);
        String value = getArgumentValue( defaultDefinition, matches );
        Class<? extends Feature> parameterType = JVMUtils.getParameterizedTypeClass(type);
        try {
            String name = defaultDefinition.fullName;
            String tribbleType = null;
            Tags tags = getArgumentTags(matches);
            if ( tags.getPositionalTags().size() > 2 ) {
                throw new UserException.CommandLineException(
                        String.format("Unexpected number of positional tags for argument %s : %s. " +
                                "Rod bindings only suport -X:type and -X:name,type argument styles",
                                value, source.field.getName()));
            } if ( tags.getPositionalTags().size() == 2 ) {
                name = tags.getPositionalTags().get(0);
                tribbleType = tags.getPositionalTags().get(1);
            } else {
                FeatureManager manager = new FeatureManager();
                String tag1 = tags.getPositionalTags().size() == 1 ? tags.getPositionalTags().get(0) : null;
                if ( tag1 != null ) {
                    if ( manager.getByName(tag1) != null ) 
                        tribbleType = tag1;
                    else
                        name = tag1;
                }
                if ( tribbleType == null ) {
                    File file = new File(value);
                    if ( file.canRead() && file.isFile() ) {
                        FeatureManager.FeatureDescriptor featureDescriptor = manager.getByFiletype(file);
                        if ( featureDescriptor != null ) {
                            tribbleType = featureDescriptor.getName();
                            logger.info("Dynamically determined type of " + file + " to be " + tribbleType);
                        }
                    }
                    if ( tribbleType == null )
                        if ( ! file.canRead() | !! file.isFile() ) {
                            throw new UserException.BadArgumentValue(name, "Couldn't read file to determine type: " + file);
                        } else {
                            throw new UserException.CommandLineException(
                                    String.format("No tribble type was provided on the command line and the type of the file could not be determined dynamically. " +
                                            "Please add an explicit type tag :NAME listing the correct type from among the supported types:%n%s",
                                            manager.userFriendlyListOfAvailableFeatures(parameterType)));
                        }
                }
            }
            Constructor ctor = (makeRawTypeIfNecessary(type)).getConstructor(Class.class, String.class, String.class, String.class, Tags.class);
            RodBinding result = (RodBinding)ctor.newInstance(parameterType, name, value, tribbleType, tags);
            parsingEngine.addTags(result,tags);
            parsingEngine.addRodBinding(result);
            return result;
        } catch (InvocationTargetException e) {
            throw new UserException.CommandLineException(
                    String.format("Failed to parse value %s for argument %s.",
                            value, source.field.getName()));
        } catch (Exception e) {
            throw new UserException.CommandLineException(
                    String.format("Failed to parse value %s for argument %s. Message: %s",
                            value, source.field.getName(), e.getMessage()));
        }
    }

    public Object parse(ParsingEngine parsingEngine, ArgumentSource source, Type type, ArgumentMatches matches) {
        ArgumentDefinition defaultDefinition = createDefaultArgumentDefinition(source);
        String value = getArgumentValue( defaultDefinition, matches );
        Class<? extends Feature> parameterType = JVMUtils.getParameterizedTypeClass(type);
        try {
            String name = defaultDefinition.fullName;
            String tribbleType = null;
            Tags tags = getArgumentTags(matches);
            if ( tags.getPositionalTags().size() > 2 ) {
                throw new UserException.CommandLineException(
                        String.format("Unexpected number of positional tags for argument %s : %s. " +
                                "Rod bindings only suport -X:type and -X:name,type argument styles",
                                value, source.field.getName()));
            } if ( tags.getPositionalTags().size() == 2 ) {
                name = tags.getPositionalTags().get(0);
                tribbleType = tags.getPositionalTags().get(1);
            } else {
                FeatureManager manager = new FeatureManager();
                String tag1 = tags.getPositionalTags().size() == 1 ? tags.getPositionalTags().get(0) : null;
                if ( tag1 != null ) {
                    if ( manager.getByName(tag1) != null ) 
                        tribbleType = tag1;
                    else
                        name = tag1;
                }
                if ( tribbleType == null ) {
                    File file = new File(value);
                    if ( file.canRead() && file.isFile() ) {
                        FeatureManager.FeatureDescriptor featureDescriptor = manager.getByFiletype(file);
                        if ( featureDescriptor != null ) {
                            tribbleType = featureDescriptor.getName();
                            logger.info("Dynamically determined type of " + file + " to be " + tribbleType);
                        }
                    }
                    if ( tribbleType == null )
                        if ( ! file.canRead() | ! file.isFile() ) {
                            throw new UserException.BadArgumentValue(name, "Couldn't read file to determine type: " + file);
                        } else {
                            throw new UserException.CommandLineException(
                                    String.format("No tribble type was provided on the command line and the type of the file could not be determined dynamically. " +
                                            "Please add an explicit type tag :NAME listing the correct type from among the supported types:%n%s",
                                            manager.userFriendlyListOfAvailableFeatures(parameterType)));
                        }
                }
            }
            Constructor ctor = (makeRawTypeIfNecessary(type)).getConstructor(Class.class, String.class, String.class, String.class, Tags.class);
            RodBinding result = (RodBinding)ctor.newInstance(parameterType, name, value, tribbleType, tags);
            parsingEngine.addTags(result,tags);
            parsingEngine.addRodBinding(result);
            return result;
        } catch (InvocationTargetException e) {
            throw new UserException.CommandLineException(
                    String.format("Failed to parse value %s for argument %s.",
                            value, source.field.getName()));
        } catch (Exception e) {
            throw new UserException.CommandLineException(
                    String.format("Failed to parse value %s for argument %s. Message: %s",
                            value, source.field.getName(), e.getMessage()));
        }
    }
