diff --git a/binaryc_python_utils/example_perl.pm b/binaryc_python_utils/example_perl.pm
new file mode 100644
index 0000000000000000000000000000000000000000..da2aa8c7f6f12e1b32d4803d240f5caa324a4090
--- /dev/null
+++ b/binaryc_python_utils/example_perl.pm
@@ -0,0 +1,95 @@
+# Autologging
+# Perl code for autogeneration
+# sub autogen_C_logging_code
+# {
+#     # given a hash of arrays of variable names, where the hash
+#     # key is the header, autogenerate PRINTF statements
+#     my ($self) = @_;
+#     my $code = undef;
+#     if(defined $self->{_grid_options}->{C_auto_logging} &&
+#        ref $self->{_grid_options}->{C_auto_logging} eq 'HASH'
+#         )
+#     {
+#         $code = '';
+
+#         foreach my $header (keys %{$self->{_grid_options}->{C_auto_logging}})
+#         {
+#             if(ref $self->{_grid_options}->{C_auto_logging}->{$header} eq 'ARRAY')
+#             {
+#                 $code .= 'PRINTF("'.$header.' ';
+#                 foreach my $x (@{$self->{_grid_options}->{C_auto_logging}->{$header}})
+#                 {
+#                     $code .= '%g ';
+#                 }
+#                 $code .= '\n"';
+
+#                 foreach my $x (@{$self->{_grid_options}->{C_auto_logging}->{$header}})
+#                 {
+#                     $code .= ',((double)stardata->'.$x.')';
+#                 }
+#                 $code .= ');'
+#             }
+#         }
+#     }
+#     print "MADE AUTO CODE \n\n************************************************************\n\n$code\n\n************************************************************\n";
+
+#     return $code;
+# }
+
+# Which is used in flexi-grid via this:
+# $population->set(    C_auto_logging => {
+#         'MY_STELLAR_DATA' =>
+#             [
+#              'model.time',
+#              'star[0].mass',
+#              'model.probability',
+#              'model.dt'
+#             ]
+#     });
+
+# binary_c_log_code
+# sub binary_c_log_code
+# {
+#     my ($code) = @_;
+#     return "
+# #pragma push_macro(\"MAX\")
+# #pragma push_macro(\"MIN\")
+# #undef MAX
+# #undef MIN
+# #include \"binary_c.h\"
+
+# void custom_output_function(SV * x);
+# SV * custom_output_function_pointer(void);
+
+# SV * custom_output_function_pointer()
+# {
+#     /*
+#      * use PTR2UV to convert the function pointer 
+#      * &custom_output_function to an unsigned int,
+#      * which is then converted to a Perl SV
+#      */
+#     return (SV*)newSVuv(PTR2UV(&custom_output_function));
+# }
+
+# void custom_output_function(SV * x)
+# {
+#     struct stardata_t * stardata = (struct stardata_t *)x;
+#     $code;
+# }
+# #undef MAX 
+# #undef MIN
+# #pragma pop_macro(\"MIN\")
+# #pragma pop_macro(\"MAX\")
+# ";
+# }
+
+# And then to use it via 
+#     $population->set(
+#         C_logging_code => '
+#              PRINTF("MY_STELLAR_DATA %g %g %g %g\n",
+#                  stardata->model.time,
+#                  stardata->star[0].mass,
+#                  stardata->model.probability,
+#                  stardata->model.dt);
+#                        '
+#     );
diff --git a/binaryc_python_utils/logging_functions.py b/binaryc_python_utils/logging_functions.py
index c0c3645e973c1bcb7d69009a9174567abc2b8c28..d77eceb8fd30f1b01c0cc9b6b7f184defa19c8bf 100644
--- a/binaryc_python_utils/logging_functions.py
+++ b/binaryc_python_utils/logging_functions.py
@@ -5,58 +5,14 @@ import textwrap
 # https://stackoverflow.com/questions/49941617/runtime-generation-and-compilation-of-cython-functions
 # https://realpython.com/cpython-source-code-guide/
 # https://docs.python.org/3.6/c-api/index.html
+# https://stackoverflow.com/questions/6626167/build-a-pyobject-from-a-c-function
+# https://docs.python.org/3.6/extending/newtypes_tutorial.html?highlight=pointer
+# https://realpython.com/cpython-source-code-guide/
+# https://diseraluca.github.io/blog/2019/03/21/wetting-feet-with-python-c-api
+# https://docs.python.org/3/c-api/function.html
 
 
-# Perl code for autogeneration
-# sub autogen_C_logging_code
-# {
-#     # given a hash of arrays of variable names, where the hash
-#     # key is the header, autogenerate PRINTF statements
-#     my ($self) = @_;
-#     my $code = undef;
-#     if(defined $self->{_grid_options}->{C_auto_logging} &&
-#        ref $self->{_grid_options}->{C_auto_logging} eq 'HASH'
-#         )
-#     {
-#         $code = '';
-
-#         foreach my $header (keys %{$self->{_grid_options}->{C_auto_logging}})
-#         {
-#             if(ref $self->{_grid_options}->{C_auto_logging}->{$header} eq 'ARRAY')
-#             {
-#                 $code .= 'PRINTF("'.$header.' ';
-#                 foreach my $x (@{$self->{_grid_options}->{C_auto_logging}->{$header}})
-#                 {
-#                     $code .= '%g ';
-#                 }
-#                 $code .= '\n"';
-
-#                 foreach my $x (@{$self->{_grid_options}->{C_auto_logging}->{$header}})
-#                 {
-#                     $code .= ',((double)stardata->'.$x.')';
-#                 }
-#                 $code .= ');'
-#             }
-#         }
-#     }
-#     print "MADE AUTO CODE \n\n************************************************************\n\n$code\n\n************************************************************\n";
-
-#     return $code;
-# }
-
-# Which is used in flexi-grid via this:
-# $population->set(    C_auto_logging => {
-#         'MY_STELLAR_DATA' =>
-#             [
-#              'model.time',
-#              'star[0].mass',
-#              'model.probability',
-#              'model.dt'
-#             ]
-#     });
-
-
-
+# See example_perl.pm autologging
 def autogen_C_logging_code(logging_dict):
     """
     Function that autogenerates PRINTF statements for binaryc
@@ -114,53 +70,7 @@ autogen_C_logging_code(
 
 ####################################################################################
 
-# sub binary_c_log_code
-# {
-#     my ($code) = @_;
-#     return "
-# #pragma push_macro(\"MAX\")
-# #pragma push_macro(\"MIN\")
-# #undef MAX
-# #undef MIN
-# #include \"binary_c.h\"
-
-# void custom_output_function(SV * x);
-# SV * custom_output_function_pointer(void);
-
-# SV * custom_output_function_pointer()
-# {
-#     /*
-#      * use PTR2UV to convert the function pointer 
-#      * &custom_output_function to an unsigned int,
-#      * which is then converted to a Perl SV
-#      */
-#     return (SV*)newSVuv(PTR2UV(&custom_output_function));
-# }
-
-# void custom_output_function(SV * x)
-# {
-#     struct stardata_t * stardata = (struct stardata_t *)x;
-#     $code;
-# }
-# #undef MAX 
-# #undef MIN
-# #pragma pop_macro(\"MIN\")
-# #pragma pop_macro(\"MAX\")
-# ";
-# }
-
-# And then to use it via 
-#     $population->set(
-#         C_logging_code => '
-#              PRINTF("MY_STELLAR_DATA %g %g %g %g\n",
-#                  stardata->model.time,
-#                  stardata->star[0].mass,
-#                  stardata->model.probability,
-#                  stardata->model.dt);
-#                        '
-#     );
-
-
+# see example_perl.pm binary_c_log_code
 
 def binary_c_log_code(code):
     """