What do you mean by sharing the function directly?
when using the sdk and you want a plugin to use certain aspects of another plugin you create an interface class which defines the access (something like imyaccess) and then the server plugin is derived from this interface class. Now if the client plugin want to access the server object it calls GetInterface(interface_id) on that object and casting it to an imyaccess type. the client plugin doesn't need to know anything about the server object except what is define in imyaccess it could be sphere or spline as long as it return a valid imyaccess type. Unfortunately this does work with maxscript so if you want imyaccess visible to mxs you use a mixin interface.
an example
#define IOUTLINER_INTERFACE_ID Interface_ID(0x12096f5b, 0x40064092)
class IOutliner : public BaseInterface
{
public:
virtual int getNumberOfOutlines() = 0;
virtual p3vector& getOutline(int outline, TimeValue t = 0) = 0;
virtual Interface_ID GetID() { return IOUTLINER_INTERFACE_ID; }
};
//********************************************************************************************
inline IOutliner* GetIOutliner(InterfaceServer* iserver)
{
return static_cast<IOutliner*>(iserver->GetInterface(IOUTLINER_INTERFACE_ID));
}
an heres a modifier using a custom planes outline as it's "cutter"

the plane just inherits from ioutline