'------------- ' Create a report interface class, e.g. IReport ' function must be empty - just the function interface Public Function RunReport(Optional ByVal param1 As Variant = "", _ Optional ByVal param2 As Variant = "", ....) End Function '------------- ' Create specific report class(es) ' e.g. MonthlyReport ' Declarations Option Explicit Implements IReport ' this function will have to be coded ' since it is an Implemented function Public Function IReport_RunReport(Optional ByVal param1 As Variant = "", _ Optional ByVal param2 As Variant = "", ....) '------------- ' code to run the specific report here '------------- End Function '------------- ' in your COM object called from the ASP page ' add a reference to the project to the interface class ' or add the cls itself to the project ' e.g. in the ASP page, the report factory is called, which then calls ' the specific type of report - e.g. ' ReportFactory.RunReportFromASP("MyReports.MonthlyReport", #2001/01#) Public Function RunReportFromASP(cClassName As String, _ Optional ByVal param1 As Variant = "", _ Optional ByVal param2 As Variant = "", ....) Dim oReport As IReport Set oReport = CreateObject(cClassName) oReport.RunReport(param1, param2, ....) End FunctionWhen the MonthlyReports class (or any other class implementing the IReport interface) is compiled, if the IReport_RunReport() function is empty, an error will be thrown. This way, you ensure that the RunReport() function will be available for the object created inside your COM server, since the object created will be assumed to implement the IReport interface.