<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_property(self, prop_name, **kwargs):
 """ Gets the SystemRDL component property If a property was not explicitly set in the RDL source, its default value is derived. In some cases, a default value is implied according to other property values. Properties values that are a reference to a component instance are converted to a :class:`~Node` overlay object. Parameters prop_name: str SystemRDL property name default: Override built-in default value of property. If the property was not explicitly set, return this value rather than the property's intrinsic default value. Raises ------ LookupError If prop_name is invalid """


        ovr_default = False
        default = None
        if 'default' in kwargs:
            ovr_default = True
            default = kwargs.pop('default')

        # Check for stray kwargs
        if kwargs:
            raise TypeError("got an unexpected keyword argument '%s'" % list(kwargs.keys())[0])

        # If its already in the component, then safe to bypass checks
        if prop_name in self.inst.properties:
            prop_value = self.inst.properties[prop_name]

            if isinstance(prop_value, rdltypes.ComponentRef):
                # If this is a hierarchical component reference, convert it to a Node reference
                prop_value = prop_value.build_node_ref(self, self.env)
            if isinstance(prop_value, rdltypes.PropertyReference):
                prop_value._resolve_node(self)

            return prop_value

        if ovr_default:
            # Default value is being overridden by user. Return their value
            return default

        # Otherwise, return its default value based on the property's rules
        rule = self.env.property_rules.lookup_property(prop_name)

        # Is it even a valid property or allowed for this component type?
        if rule is None:
            raise LookupError("Unknown property '%s'" % prop_name)
        if type(self.inst) not in rule.bindable_to:
            raise LookupError("Unknown property '%s'" % prop_name)

        # Return the default value as specified by the rulebook
        return rule.get_default(self)